# 18-使用Java Config实现Spring Ioc

回到spring导航页

基于Java Config的优势

  • 完全摆脱XML的束缚,使用独立Java类管理对象与依赖
  • 注解配置相对分散,利用Java Config可对配置集中管理
  • 可以在编译时进行依赖检查,不容易出错

基于Java Config的缺点

  • 如果后续需要更改接口实现类,则需要修改源码,重新编译打包发布

# 18-Java Config-对象实例化

Java Config核心注解

注解 说明
@Configuration 描述类,说明当前类是Java Config配置类,完全替代XML文件
@Bean 描述方法,方法返回对象将被IoC容器管理,beanId默认为方法名
@ImportResource 描述类,加载静态文件,可使用@Value注解获取
@ComponentScan 组件扫描,同XML的<context:compoment-scan>标签

# Java Config对象实例化-示例代码

目录

package com.torey.spring.ioc;

import com.torey.spring.ioc.controller.UserController;
import com.torey.spring.ioc.dao.UserDao;
import com.torey.spring.ioc.service.UserService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @Author http://torey611.gitee.io/li-tao-feng/
 * @Email torey6061@qq.com
 * @Date 2021/5/1 10:42
 * @描述:
 */
@Configuration//当前类是一个配置类,用于替代applicationContext.xml文件
public class Config {
    @Bean //Java Config利用方法创建对象,将方法返回对象放入容器,beanId=方法名
    public UserDao userDao(){
        return new UserDao();
    }
    @Bean
    public UserService userService(){
        return new UserService();
    }
    @Bean
    public UserController userController(){
        return new UserController();
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package com.torey.spring.ioc;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 * @Author http://torey611.gitee.io/li-tao-feng/
 * @Email torey6061@qq.com
 * @Date 2021/5/1 10:51
 * @描述:
 */
public class SpringApplication {
    public static void main(String[] args) {
        //基于Java Config配置IoC容器初始化
        AnnotationConfigApplicationContext context= new AnnotationConfigApplicationContext(Config.class);
        String[] definitionNames = context.getBeanDefinitionNames();
        for (String name : definitionNames) {
            System.out.println(name);
        }
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

打印输出如下:

org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
config
userDao
userService
userController
1
2
3
4
5
6
7
8
9

# Java Config-对象依赖注入-示例代码

目录

package com.torey.spring.ioc.dao;

/**
 * @Author http://torey611.gitee.io/li-tao-feng/
 * @Email torey6061@qq.com
 * @Date 2021/5/1 10:41
 * @描述:
 */
public class UserDao {
}
1
2
3
4
5
6
7
8
9
10
package com.torey.spring.ioc.dao;

import org.springframework.stereotype.Repository;

/**
 * @Author http://torey611.gitee.io/li-tao-feng/
 * @Email torey6061@qq.com
 * @Date 2021/5/1 11:42
 * @描述:
 */
@Repository
public class EmployeeDao {
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.torey.spring.ioc.service;

import com.torey.spring.ioc.dao.EmployeeDao;
import com.torey.spring.ioc.dao.UserDao;

/**
 * @Author http://torey611.gitee.io/li-tao-feng/
 * @Email torey6061@qq.com
 * @Date 2021/5/1 10:42
 * @描述:
 */
public class UserService {
    private UserDao userDao;
    private EmployeeDao employeeDao;
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void setEmployeeDao(EmployeeDao employeeDao) {
        this.employeeDao = employeeDao;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.torey.spring.ioc.controller;

import com.torey.spring.ioc.service.UserService;

/**
 * @Author http://torey611.gitee.io/li-tao-feng/
 * @Email torey6061@qq.com
 * @Date 2021/5/1 10:41
 * @描述:
 */
public class UserController {
    private UserService userService;

    public void setUserService(UserService userService) {
        this.userService = userService;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.torey.spring.ioc;

import com.torey.spring.ioc.controller.UserController;
import com.torey.spring.ioc.dao.EmployeeDao;
import com.torey.spring.ioc.dao.UserDao;
import com.torey.spring.ioc.service.UserService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

/**
 * @Author http://torey611.gitee.io/li-tao-feng/
 * @Email torey6061@qq.com
 * @Date 2021/5/1 10:42
 * @描述: Bean Java Config利用方法创建对象,将方法返回对象放入容器,beanId=方法名
 *
 */
@Configuration//当前类是一个配置类,用于替代applicationContext.xml文件
@ComponentScan("com.torey.spring.ioc") //@ComponentScan 会扫描所配置包,如果类上有标注了@Repository,就会被sping ioc容器管理
public class Config {
    //先按name尝试注入,name不存在则按类型注入
    @Bean//Java Config利用方法创建对象,将方法返回对象放入容器,beanId=方法名
    public UserService userService(UserDao userDao ,EmployeeDao employeeDao){
        UserService userService = new UserService();
        userService.setUserDao(userDao);
        userService.setEmployeeDao(employeeDao);
        System.out.println(this.getClass().getName() + "userService已创建");
        return userService;
    }
    @Bean
    public UserController userController(UserService userService){
        UserController userController = new UserController();
        userController.setUserService(userService);
        System.out.println(this.getClass().getName() + "userController已创建");
        return userController;
    }

    @Bean
    public UserDao userDao(){
        UserDao userDao = new UserDao();
        System.out.println(this.getClass().getName() + "userDao已创建");
        return userDao;
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package com.torey.spring.ioc;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 * @Author http://torey611.gitee.io/li-tao-feng/
 * @Email torey6061@qq.com
 * @Date 2021/5/1 10:51
 * @描述:
 */
public class SpringApplication {
    public static void main(String[] args) {
        //基于Java Config配置IoC容器初始化
        AnnotationConfigApplicationContext context= new AnnotationConfigApplicationContext(Config.class);
        String[] definitionNames = context.getBeanDefinitionNames();
        for (String name : definitionNames) {
            System.out.println(name);
        }
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 导航,上一页,下一页

17其他元数据注解
19 Java与JUnit4整合

# 支持我-微信扫一扫-加入微信公众号

Aseven公众号

# 赞赏作者

赞赏作者